package com.me.services.memory;

import com.me.exception.GenericConstraintException;
import com.me.model.normal.NormalItem;
import com.me.model.Item;
import com.me.model.User;
import com.me.model.normal.NormalUser;
import com.me.services.IItemService;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.ParameterizedType;
import java.util.*;

//吕旺平 宋杰
public class ItemMemoryService implements IItemService<NormalUser, NormalItem> {
	private static List<NormalItem> itemList;
	private static boolean initial = false;
	
	public ItemMemoryService() {
		if (itemList == null) {
			itemList = new ArrayList<NormalItem>();
			addItem(new NormalItem("1+1=（）", new String[]{"1", "2", "3"}, 2, "b"));
			addItem(new NormalItem("2*=89()", new String[]{"177", "178", "179", "245"}, 2, "b"));
			addItem(new NormalItem("123*=1()", new String[]{"122", "121", "123", "-123"}, 2, "c"));
			addItem(new NormalItem("含有正确的句子", new String[]{"正确了", "确证了", "了正确", "确了正"}, 5, "ac", true));
			addItem(new NormalItem("选择所有的数字", new String[]{"1", "一", "3", "5"}, 5, "acd", true));
		}

	}
	
	@Override
	public void addItem(NormalItem item) {
		item.setId(itemList.size());
		itemList.add(item);
	}
	
	@Override
	public void initial(NormalUser u) {
		if (initial) return;
		Map<Integer, Item> itemMap = u.getItemMap();
		for (Item i : itemList) {
			itemMap.put(i.getId(), i);
		}
		initial = true;
	}
	
	@Override
	public NormalItem getItem(int id) {
		if (id > getItemCount() - 1) {
			id = getItemCount() - 1;
		} else if (id < 0) {
			id = 0;
		}
		return itemList.get(id);
	}
	
	@Override
	public NormalItem getItemFromUser(NormalUser u, int itemId) {
		if (itemId > getItemCount() - 1) {
			itemId = getItemCount() - 1;
		} else if (itemId < 0) {
			itemId = 0;
		}
		return (NormalItem)u.getItemMap().get(itemId);
	}
	
	@Override
	public Collection<NormalItem> getAll() {
		return itemList;
	}
	
	@Override
	public Collection<NormalItem> getAllFromUser(NormalUser u) {
		return convert(u.getItemMap().values());
	}
	
	@Override
	public int getItemCount() {
		return itemList.size();
	}
	
	@Override
	public void record(NormalUser user, NormalItem item, int chooseId) {
		user.getItemMap().get(item.getId()).setChooseId(chooseId);
	}
	
	@Override
	public int getScore(NormalUser u) {
		int score = 0;
		for (Item i : getAllFromUser(u)) {
			if (i.isRight()) {
				score += i.getScore();
			}
		}
		return score;
	}

	@Override
	public boolean delete(int id) {
		for (Item i : itemList) {
			if (i.getId() == id) {
				itemList.remove(i);
				for (int j = id; j < itemList.size(); j++) {
					itemList.get(j).setId(j);
				}
				return true;
			}
		}
		return false;
	}

	@Override
	public boolean update(Item i) {
		for (int j = 0; j < itemList.size(); j++) {
			if (itemList.get(j).getId() == i.getId()) {
				itemList.set(j, (NormalItem) i);
				return true;
			}
		}
		return false;
	}

	private Collection<NormalItem> convert(Collection<Item> itemColl){
		List<NormalItem> itemList = new ArrayList<>();
		for (Item i : itemColl) {
			itemList.add((NormalItem)i);
		}
		return itemList;
	}

//	@Override
//	public void addItem(Item item){
//		addItem(title, content, score, answer, false);
//	}
//
//	@Override
//	public void addItem(String title, String[] content, int score, String answer, boolean multiple) {
//		try {
//			Constructor<TItem> cons = itemEntityClass.getDeclaredConstructor(
//					int.class, String.class, String[].class, int.class, String.class, boolean.class
//			);
//
//			itemList.add(cons.newInstance(itemList.size(), title, content, score, answer, multiple));
//		} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
//			e.printStackTrace();
//		}
//	}
//
//	@Override
//	public void initial(TUser u) {
//		if (initial) {
//			return;
//		}
//
//		try {
//			Map<Integer, TItem> itemMap = (Map<Integer, TItem>) u.getClass().getMethod("getItemMap").invoke(u);
//			for (TItem i : itemList) {
//				itemMap.put((Integer) i.getClass().getMethod("getId").invoke(i), i);
//			}
//		} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
//			e.printStackTrace();
//		}
//
//		initial = true;
//	}
//
//	@Override
//	public Collection<TItem> getAll() {
//		return itemList;
//	}
//
//	@Override
//	public Collection<TItem> getAllFromUser(TUser u) {
//		try {
//			return ((Map<Integer, TItem>) u.getClass().getMethod("getItemMap").invoke(u)).values();
//		} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
//			e.printStackTrace();
//		}
//		return null;
//	}
//
//	@Override
//	public TItem getItem(int id) {
//		if (id > getItemCount() - 1) {
//			id = getItemCount() - 1;
//		} else if (id < 0) {
//			id = 0;
//		}
//		return itemList.get(id);
//	}
//
//	@Override
//	public TItem getItemFromUser(TUser u, int itemId) {
//		try {
//			if (itemId > getItemCount() - 1) {
//				itemId = getItemCount() - 1;
//			} else if (itemId < 0) {
//				itemId = 0;
//			}
//			return ((Map<Integer, TItem>) u.getClass().getMethod("getItemMap").invoke(u)).get(itemId);
//		} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
//			e.printStackTrace();
//		}
//
//		return null;
//	}
//
//	@Override
//	public int getItemCount() {
//		return itemList.size();
//	}
//
//	@Override
//	public void record(TUser u, TItem i, int chooseId) {
//		try {
//			i.getClass().getMethod("setChooseId",int.class).invoke(i,chooseId);
//			((Map<Integer, TItem>) u.getClass().getMethod("getItemMap").invoke(u)).
//					put((Integer) i.getClass().getMethod("getId").invoke(i), i);
//		} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
//			e.printStackTrace();
//		}
//	}
//
//	@Override
//	public int getScore(TUser u) {
//		try {
//			int score = 0;
//			for (TItem i : getAllFromUser(u)) {
//				if ((boolean)i.getClass().getMethod("isRight").invoke(i)) {
//					score += (Integer) i.getClass().getMethod("getScore").invoke(i);
//				}
//			}
//			return score;
//		} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
//			e.printStackTrace();
//		}
//		return 0;
//	}
	
	
}